{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Welcome to Brancher\n",
    "Brancher is a user-centered probabilistic differentiable programming library. Brancher is designed to be as beginner friendly as possible and to minimize boilerplate code while retaining all the power and flexibility of general-purpose differentiable probabilistic programming and deep learning. Brancher is built around the deep learning framework [PyTorch](https://pytorch.org/). \n",
    "\n",
    "In this notebook I will explain how to use Brancher for writing your own differentiable probabilistic program and perform variational inference in a/only few lines of code. Let's start by importing some modules!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('/home/luca/GitRepositories/Brancher')\n",
    "\n",
    "import torch\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from brancher.variables import ProbabilisticModel\n",
    "from brancher.standard_variables import NormalVariable, LogNormalVariable\n",
    "from brancher import inference\n",
    "import brancher.functions as BF"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Brancher is an object oriented library. This means that all objects in brancher are instantiation of classes that define the abstractions required for probabilistic programming. The foundamental building block of all Brancher programs is the RandomVariable class. probabilistic models are constructed by linking random variables through differentiable functions. RandomVariables are characterized by a probability distribution, a set of parent variables and a link that specifies how the values of the parents determine the parameters of its distribution.\n",
    "\n",
    "For example, let's define a model where the mean of a normal random variable (mu) is determined by the sine of another normal random variable. Brancher allows you to define his model symbolically like you would do in a scientific paper:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Model\n",
    "nu = LogNormalVariable(loc=0., scale=1., name=\"nu\")\n",
    "mu = NormalVariable(loc=0., scale=10., name=\"mu\")\n",
    "x = NormalVariable(loc=BF.sin(mu), scale=nu, name=\"x\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You have to admit that this is a pretty clean sintax! The classes LogNormalVariable and  NormalVariable are subclasses of RandomVariables. The [log normal](https://en.wikipedia.org/wiki/Log-normal_distribution) variable is obtained by taking the exponential of a normal random variable. This is a known special case of the differentiable probabilistic programming approach of obtaining new probability distributions by applying differentiable functions on a small set of basic distributions such as the normal.\n",
    "\n",
    "Let's now define a probabilistic model with all our variables:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = ProbabilisticModel([x, mu, nu])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Since mu and nu are parents of x, ProbabilisticModel([x])\n",
    "\n",
    "This expression is slightly reduntant because ProbabilisticModel([x]) already contains all the variables since mu and nu are parents of x. However, I recommend explicitly inputing all the variables for making your code more readable. \n",
    "\n",
    "We can now print a summary of our model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nu</th>\n",
       "      <th>mu_loc</th>\n",
       "      <th>mu</th>\n",
       "      <th>mu_scale</th>\n",
       "      <th>x</th>\n",
       "      <th>nu_loc</th>\n",
       "      <th>nu_scale</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Distribution</th>\n",
       "      <td>Log Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Deterministic</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Parents</th>\n",
       "      <td>{nu_scale, nu_loc}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{mu_loc, mu_scale}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{mu, nu}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{}</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Observed</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                              nu         mu_loc                  mu  \\\n",
       "Distribution          Log Normal  Deterministic              Normal   \n",
       "Parents       {nu_scale, nu_loc}             {}  {mu_loc, mu_scale}   \n",
       "Observed                   False          False               False   \n",
       "\n",
       "                   mu_scale         x         nu_loc       nu_scale  \n",
       "Distribution  Deterministic    Normal  Deterministic  Deterministic  \n",
       "Parents                  {}  {mu, nu}             {}             {}  \n",
       "Observed              False     False          False          False  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.model_summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we would expect, the variable x has mu and nu as parents. However, you might be surprised by the fact that there are new variables such as mu_mu and mu_sigma whioch we did not explicitly defined. These are deterministic variables that represent the fixed values of the parameters of our distribution. DeterministicVariables are a special case of BrancherVariables, they behave pretty much like RandomVariables expect their value being deterministic. As you can see, often you will not need to define these variables explicitly since Brancher will constract them for you when you input numbers or np.array as parameters for your RandomVariables.\n",
    "\n",
    "All the variables are currently marked as not observed. We will see how to \"observe\" some variables by inputing data later on.\n",
    "\n",
    "Let's now have a look to sampling: the most important operation you can do on probabilisticModels!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mu_loc</th>\n",
       "      <th>mu_scale</th>\n",
       "      <th>mu</th>\n",
       "      <th>nu_scale</th>\n",
       "      <th>nu_loc</th>\n",
       "      <th>nu</th>\n",
       "      <th>x</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>0.808285</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.072378</td>\n",
       "      <td>1.486100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>12.279623</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.610439</td>\n",
       "      <td>-0.703482</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>-3.340621</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.408964</td>\n",
       "      <td>-0.218620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>0.664779</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.749260</td>\n",
       "      <td>0.684522</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>-11.723947</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.801317</td>\n",
       "      <td>0.593664</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>-14.605591</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.092042</td>\n",
       "      <td>1.203351</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>6.438367</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.631627</td>\n",
       "      <td>-0.901684</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>22.934248</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6.181613</td>\n",
       "      <td>-13.972402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>-2.937538</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.201508</td>\n",
       "      <td>-0.597040</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.0</td>\n",
       "      <td>9.999954</td>\n",
       "      <td>-0.122927</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.239505</td>\n",
       "      <td>1.268376</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   mu_loc  mu_scale         mu  nu_scale  nu_loc        nu          x\n",
       "0     0.0  9.999954   0.808285  0.541325     0.0  1.072378   1.486100\n",
       "1     0.0  9.999954  12.279623  0.541325     0.0  0.610439  -0.703482\n",
       "2     0.0  9.999954  -3.340621  0.541325     0.0  1.408964  -0.218620\n",
       "3     0.0  9.999954   0.664779  0.541325     0.0  1.749260   0.684522\n",
       "4     0.0  9.999954 -11.723947  0.541325     0.0  0.801317   0.593664\n",
       "5     0.0  9.999954 -14.605591  0.541325     0.0  1.092042   1.203351\n",
       "6     0.0  9.999954   6.438367  0.541325     0.0  2.631627  -0.901684\n",
       "7     0.0  9.999954  22.934248  0.541325     0.0  6.181613 -13.972402\n",
       "8     0.0  9.999954  -2.937538  0.541325     0.0  1.201508  -0.597040\n",
       "9     0.0  9.999954  -0.122927  0.541325     0.0  3.239505   1.268376"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Print samples\n",
    "sample = model.get_sample(10)\n",
    "sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, if we sample from the ProbabilisticModel we get samples for all the variables in our model. We can also sample from the individual variables:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.387607</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-6.187064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.269301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.113456</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-2.858394</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.763187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-3.079767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.313820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-1.482616</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-0.887327</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x\n",
       "0 -0.387607\n",
       "1 -6.187064\n",
       "2  0.269301\n",
       "3  0.113456\n",
       "4 -2.858394\n",
       "5  0.763187\n",
       "6 -3.079767\n",
       "7  0.313820\n",
       "8 -1.482616\n",
       "9 -0.887327"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Print samples from single variable\n",
    "x_sample = x.get_sample(10)\n",
    "x_sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that Brancher is still sampling all the parents of x recursively (parents of the parents and so on) since it needs all these values for sampling x.\n",
    "\n",
    "Another thing we can do is to sample after inputing the values of some variables. This converts the ProbabilisticModel into a random function that takes some input and output some samples with the probability distribution defined by the model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mu</th>\n",
       "      <th>nu_scale</th>\n",
       "      <th>nu_loc</th>\n",
       "      <th>nu</th>\n",
       "      <th>x</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3.129300</td>\n",
       "      <td>2.300809</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>5.791911</td>\n",
       "      <td>4.017151</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.346305</td>\n",
       "      <td>0.246316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.222246</td>\n",
       "      <td>-0.057001</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.338297</td>\n",
       "      <td>-0.853128</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.478378</td>\n",
       "      <td>-0.717123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.187540</td>\n",
       "      <td>3.551509</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.393402</td>\n",
       "      <td>-1.281143</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.864683</td>\n",
       "      <td>7.547813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>100.0</td>\n",
       "      <td>0.541325</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.396567</td>\n",
       "      <td>-1.021750</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      mu  nu_scale  nu_loc        nu         x\n",
       "0  100.0  0.541325     0.0  3.129300  2.300809\n",
       "1  100.0  0.541325     0.0  5.791911  4.017151\n",
       "2  100.0  0.541325     0.0  0.346305  0.246316\n",
       "3  100.0  0.541325     0.0  0.222246 -0.057001\n",
       "4  100.0  0.541325     0.0  0.338297 -0.853128\n",
       "5  100.0  0.541325     0.0  0.478378 -0.717123\n",
       "6  100.0  0.541325     0.0  2.187540  3.551509\n",
       "7  100.0  0.541325     0.0  0.393402 -1.281143\n",
       "8  100.0  0.541325     0.0  4.864683  7.547813\n",
       "9  100.0  0.541325     0.0  0.396567 -1.021750"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Print samples conditional on an input\n",
    "in_sample = model.get_sample(10, input_values={mu: 100.})\n",
    "in_sample"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that this is equivalent to conditioning the model on the value of some variables and sampling everything downstream (children, grandchildren and so on). In order to sample upstream of some known values we need to define observation and use variational inference for getting an approximate posterior distribution. Let's begin by defining some ground truth values for the mu and nu variables and generate some synthetic observations:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# # Generate data\n",
    "nu_real = 0.5\n",
    "mu_real = -1.\n",
    "data = x.get_sample(number_samples=100, input_values={mu: mu_real, nu: nu_real})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now tell Brancher that the x variable is observed with the values specified by our data. In this case data is a Pandas dataframe since it is the output of the get_sample method. However you can also input a single number or an np.array of any shape (the first dimension of the array is going to be the batch dimension while the other define tensor values observations)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nu</th>\n",
       "      <th>mu_loc</th>\n",
       "      <th>mu</th>\n",
       "      <th>mu_scale</th>\n",
       "      <th>x</th>\n",
       "      <th>nu_loc</th>\n",
       "      <th>nu_scale</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Distribution</th>\n",
       "      <td>Log Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Normal</td>\n",
       "      <td>Deterministic</td>\n",
       "      <td>Deterministic</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Parents</th>\n",
       "      <td>{nu_scale, nu_loc}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{mu_loc, mu_scale}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{mu, nu}</td>\n",
       "      <td>{}</td>\n",
       "      <td>{}</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Observed</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                              nu         mu_loc                  mu  \\\n",
       "Distribution          Log Normal  Deterministic              Normal   \n",
       "Parents       {nu_scale, nu_loc}             {}  {mu_loc, mu_scale}   \n",
       "Observed                   False          False               False   \n",
       "\n",
       "                   mu_scale         x         nu_loc       nu_scale  \n",
       "Distribution  Deterministic    Normal  Deterministic  Deterministic  \n",
       "Parents                  {}  {mu, nu}             {}             {}  \n",
       "Observed              False      True          False          False  "
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Observe data\n",
    "x.observe(data)\n",
    "model.model_summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see the x variable is now observed. If you want to sample the variables mu and nu that are downstream x you need to perform approximate Bayesian inference. In Brancher, you can do this by defining a variational distribution for all the variables you want to sample from. The variational model is a probabilistic model itself and it is constructed in the very same way of our original probabilistic model.\n",
    "\n",
    "if you want to go deeper into the theory behind the variational approximation you can start with the [wikipedia page](https://en.wikipedia.org/wiki/Variational_Bayesian_methods) or excellent textbooks such as [Pattern recognition and machine learning](https://cds.cern.ch/record/998831/files/9780387310732_TOC.pdf).\n",
    "\n",
    "The simplest way of specifying this distribution is the use the same distributions you had in your original model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Variational model\n",
    "Qnu = LogNormalVariable(0., 1., \"nu\", learnable=True)\n",
    "Qmu = NormalVariable(0., 1., \"mu\", learnable=True)\n",
    "model.set_posterior_model(ProbabilisticModel([Qmu, Qnu]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now need to use some stochastic optimization (usual deep leaning stuff...) for learning the parameters of our variational approximation. This technique is called stochastic variational inference and it is extremely powerful since it neatly fit Bayesian inference into the deep learning framework (indeed brancher is designed to work with deep neural networks as building blocks for complex probabilistic models).\n",
    "\n",
    "We told Brancher that the parameters of the variational distributions are learnable using the \"learnable\" flag. Let's now learn those parameters:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/luca/GitRepositories/Brancher/brancher/inference.py:61: UserWarning: The inference method was not specified, using the default reverse KL variational inference\n",
      "  warnings.warn(\"The inference method was not specified, using the default reverse KL variational inference\")\n",
      "100%|██████████| 500/500 [00:02<00:00, 218.17it/s]\n"
     ]
    }
   ],
   "source": [
    "# Inference\n",
    "inference.perform_inference(model,\n",
    "                            number_iterations=500,\n",
    "                            number_samples=50,\n",
    "                            optimizer=\"Adam\",\n",
    "                            lr=0.01)\n",
    "loss_list = model.diagnostics[\"loss curve\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Et voilà, the approximate posterior distribution is trained. The number_samples parameter specify the minibatch size of the parameters sampled from the variational distribution. You need to know something about stochastic variational inference for fully getting this point and I will cover it more properly in more advanced tutorials.\n",
    "\n",
    "Let's now plot the loss to be sure that everything went fine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7f9520e4d898>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAD8CAYAAACRkhiPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8VPW9//HXJysk7BD2XVkEF0SK4FbrVtRet7ZeuFZpa0sX/bVae1tt771WW+1mtUWtlipV27rvWxVE6i7IvgkS9iwkIUD2Pd/fH3MymUkmIZMJhMx5Px+PPDLzne+cOScHzvt8l3PGnHOIiIg/JXT2CoiISOdRCIiI+JhCQETExxQCIiI+phAQEfExhYCIiI8pBEREfEwhICLiYwoBEREfS+rsFTiUAQMGuNGjR3f2aoiIdBkrV67c55zLaEvdoz4ERo8ezYoVKzp7NUREugwz29XWuuoOEhHxMYWAiIiPKQRERHxMISAi4mMKARERH1MIiIj4mEJARMTHFAJRem5lFh9vL+zs1RAR6RBH/cViR5OaunpuemYtADt/c3Enr42ISOzUEoiCc529BiIiHUshEAWHUkBE4otCQETExxQCUVB3kIjEG4WAiIiPHTIEzGyhmeWb2YaQsqfMbI33s9PM1njlo82sIuS1B0Pec4qZrTezTDObb2Z2eDZJRETaqi1TRB8B7gMeayhwzv1nw2Mz+wNQFFJ/m3NuSoTlPADMAz4GXgdmAf+KfpVFRKSjHLIl4Jx7F9gf6TXvbP5K4InWlmFmQ4BezrmPnHOOQKBcFv3qiohIR4p1TOBMIM85tzWkbIyZrTazd8zsTK9sGJAVUifLK+tSNDAsIvEm1iuG5xDeCsgFRjrnCs3sFOBFM5sMROr/b/GQambzCHQdMXLkyBhXUUREWtLuloCZJQFXAE81lDnnqpxzhd7jlcA2YDyBM//hIW8fDuS0tGzn3ALn3DTn3LSMjDZ9V/IRoYvFRCTexNIddB6w2TkX7OYxswwzS/QejwXGAdudc7lAiZnN8MYRrgFeiuGzRUSkA7RliugTwEfABDPLMrNrvZdm03xA+CxgnZmtBZ4FvuucaxhU/h7wEJBJoIXQ5WYGaUxAROLNIccEnHNzWij/eoSy54DnWqi/Ajg+yvUTEZHDSFcMi4j4mEIgCuoNEpF4oxAQEfExhUAUnEaGRSTOKARERHxMIRAFtQNEJN4oBEREfEwhEAUNCYhIvFEIiIj4mEJARMTHFALRUHeQiMQZhYCIiI8pBKKg7xMQkXijEBAR8TGFQBQ0RVRE4o1CQETExxQCUVBDQETijUJARMTHFAIiIj6mEIiCvk9AROLNIUPAzBaaWb6ZbQgp+4WZZZvZGu/nopDXbjGzTDPbYmZfDCmf5ZVlmtnNHb8pIiISrba0BB4BZkUov8c5N8X7eR3AzCYBs4HJ3nv+bGaJZpYI3A9cCEwC5nh1uxS1A0Qk3iQdqoJz7l0zG93G5V0KPOmcqwJ2mFkmMN17LdM5tx3AzJ706m6Keo1FRKTDxDImcL2ZrfO6i/p6ZcOAPSF1sryylsojMrN5ZrbCzFYUFBTEsIodS0MCIhJv2hsCDwDHAFOAXOAPXrlFqOtaKY/IObfAOTfNOTctIyOjnasoIiKHcsjuoEicc3kNj83sr8Cr3tMsYERI1eFAjve4pXIREekk7WoJmNmQkKeXAw0zh14GZptZqpmNAcYBy4FPgHFmNsbMUggMHr/c/tXuHLqLqIjEm0O2BMzsCeBsYICZZQG3Ameb2RQCXTo7ge8AOOc2mtnTBAZ8a4HrnHN13nKuB94EEoGFzrmNHb41IiISlbbMDpoTofjhVurfAdwRofx14PWo1u5oo4aAiMQZXTEsIuJjCoEoqCEgIvFGISAi4mMKgSjoYjERiTcKARERH1MIiIj4mEIgCrpYTETijUJARMTHFAJR0MCwiMQbhYCIiI8pBKKghoCIxBuFgIiIjykEouA0KCAicUYhICLiYwoBEREfUwhEQb1BIhJvFAIiIj6mEBAR8TGFgIiIjx0yBMxsoZnlm9mGkLLfm9lmM1tnZi+YWR+vfLSZVZjZGu/nwZD3nGJm680s08zmm5kdnk06fDQmICLxpi0tgUeAWU3KFgPHO+dOBD4Dbgl5bZtzbor3892Q8geAecA476fpMkVE5Ag7ZAg4594F9jcpW+Scq/WefgwMb20ZZjYE6OWc+8gFrrh6DLisfavceXQraRGJNx0xJvBN4F8hz8eY2Woze8fMzvTKhgFZIXWyvDIREelESbG82cx+DtQC//SKcoGRzrlCMzsFeNHMJgOR+v9bPK02s3kEuo4YOXJkLKsoIiKtaHdLwMzmAl8CrvK6eHDOVTnnCr3HK4FtwHgCZ/6hXUbDgZyWlu2cW+Ccm+acm5aRkdHeVexwGhgWkXjTrhAws1nAT4FLnHPlIeUZZpboPR5LYAB4u3MuFygxsxnerKBrgJdiXnsREYnJIbuDzOwJ4GxggJllAbcSmA2UCiz2Znp+7M0EOgu43cxqgTrgu865hkHl7xGYadSdwBhC6DhCl6CGgIjEm0OGgHNuToTih1uo+xzwXAuvrQCOj2rtRETksNIVw1HQ9wmISLxRCIiI+JhCQETExxQCUVBnkIjEG4WAiIiPKQSioHFhEYk3CgERER9TCERFTQERiS8KARERH1MIREFjAiISbxQCIiI+phAQEfExhUAU1BskIvFGISAi4mMKgShoYFhE4o1CQETExxQCUXAaFRCROKMQEBHxMYVAFDQmICLxpk0hYGYLzSzfzDaElPUzs8VmttX73dcrNzObb2aZZrbOzKaGvGeuV3+rmc3t+M0REZFotLUl8Agwq0nZzcAS59w4YIn3HOBCYJz3Mw94AAKhAdwKnApMB25tCA4REekcbQoB59y7wP4mxZcCj3qPHwUuCyl/zAV8DPQxsyHAF4HFzrn9zrkDwGKaB8tRTd1BIhJvYhkTGOScywXwfg/0yocBe0LqZXllLZWLiEgnORwDwxahzLVS3nwBZvPMbIWZrSgoKOjQlYuFpoiKSLyJJQTyvG4evN/5XnkWMCKk3nAgp5XyZpxzC5xz05xz0zIyMmJYRRERaU0sIfAy0DDDZy7wUkj5Nd4soRlAkddd9CZwgZn19QaEL/DKugyNCYhIvElqSyUzewI4GxhgZlkEZvn8BnjazK4FdgNf9aq/DlwEZALlwDcAnHP7zeyXwCdevdudc00Hm0VE5AhqUwg45+a08NK5Eeo64LoWlrMQWNjmtYvRe1sL2JhTzHc/f8yR+kgRkS6lTSHQVV398HIA5kwfSe/uyZ28NiIiRx9f3DbCqTNfRCQin4TA0bUcEZGjhT9CoLNXQETkKOWPEOigU3hdLCYi8cYXIfDX93bw8Ps7Ons1RESOOnE9O6jBg+9sA+DaM8bEtByNCYhIvPFFS0BERCJTCERBDQERiTcKARERH1MIiIj4mEIgCrryWETijUJARMTHFAJRUDtAROKNQkBExMcUAlHQkICIxBtfhUD2wQrKqmo7ezVERI4avgqB03/zNnMXLu/s1RAROWr4KgQAVuw6EMO71R8kIvHFdyEgIiKN2h0CZjbBzNaE/BSb2Q1m9gszyw4pvyjkPbeYWaaZbTGzL3bMJhw5GhgWkXjT7ltJO+e2AFMAzCwRyAZeAL4B3OOcuyu0vplNAmYDk4GhwFtmNt45V9fedRARkdh0VHfQucA259yuVupcCjzpnKtyzu0AMoHpHfT5R4QaAiISbzoqBGYDT4Q8v97M1pnZQjPr65UNA/aE1MnyykREpJPEHAJmlgJcAjzjFT0AHEOgqygX+END1Qhvj3hybWbzzGyFma0oKCiIdRWbWb27fTOENCYgIvGmI1oCFwKrnHN5AM65POdcnXOuHvgrjV0+WcCIkPcNB3IiLdA5t8A5N805Ny0jI6MDVjFc9sGKDl+miEhX1BEhMIeQriAzGxLy2uXABu/xy8BsM0s1szHAOKBTrtzSGb2ISEBMXzRvZmnA+cB3Qop/Z2ZTCHT17Gx4zTm30cyeBjYBtcB1nTUzqL0ZoO8TEJF4E1MIOOfKgf5Nyq5upf4dwB2xfGZH0MFcRCTAl1cMtzcDFB0iEm/8GQI6nIuIAD4Ngfr69r1PvUgiEm98GQI6louIBPgzBNp5Sq9uJBGJNz4NgY5YhgJBRLo+f4aAzuhFRAC/hkC7rxbr0NUQEel0vgyB+g7pDop9GSIinc2XIdDe7iAd90Uk3vgzBDqiJRD7IkREOp1PQ6CdLQEd+UUkzvgzBDp7BUREjhL+DIF230Cu8Y26TkBE4oEvQ6D+MBzAb3xqDT97YX2HL1dE5HDyZQg0ZMDB8mr2FlW2bxlNnr+wOpvHl+2ObcVERI4wf4aA9/uS+z5gxq+XtP196gESkTjjzxDwjua795fHsIyOWhsRkc7j0xBo+rxtR3Qd90Uk3sQcAma208zWm9kaM1vhlfUzs8VmttX73dcrNzObb2aZZrbOzKbG+vnt0fSK4VhvI6GZQiLSVXVUS+ALzrkpzrlp3vObgSXOuXHAEu85wIXAOO9nHvBAB31+VJoe9Ns6Wyj0YB8aJB1xLyIRkc5wuLqDLgUe9R4/ClwWUv6YC/gY6GNmQw7TOrSo6TE/1imjte39vkoRkU7WESHggEVmttLM5nllg5xzuQDe74Fe+TBgT8h7s7yyI6ppd1B7MiD0PXVqCohIF5XUAcs43TmXY2YDgcVmtrmVuhahrNkR1AuTeQAjR47sgFVs8oHt7Q5qobxWISAiXVTMLQHnXI73Ox94AZgO5DV083i/873qWcCIkLcPB3IiLHOBc26ac25aRkZGrKsY1LNbUsPyw8pjPYbX1SkERKRriikEzCzdzHo2PAYuADYALwNzvWpzgZe8xy8D13izhGYARQ3dRkdCalIiEMOYQAvV6jQ7SES6qFi7gwYBL5hZw7Ied869YWafAE+b2bXAbuCrXv3XgYuATKAc+EaMnx+V1KRA5jU983cxjutqTEBEuqqYQsA5tx04KUJ5IXBuhHIHXBfLZ8aiIQSaXyfQ1jGB0LuINpZrTEBEuipfXTGcEtISKK2qDZbHOkVUYwIi0lV1xOygLqOhJTB/yVbmL9kaLG/riXxoVoS2CnSdgIh0Vb5rCViESaqx3vZBYwIi0lX5KgSSExMiXqgQ6zFcYwIi0lX5KgR6dUsmIUJToK1TPMO6g3TFsIjEAd+EwIAeKfzg3HERu4PqYzyIh4aA7igqIl2Jb0Lg11ecyKShvbAIHULtuVYs9PGm3OLgYzUKRKQr8U0IJHjH/ogtgRjP3rcXlAYfqyUgIl1J3IZA04OxdUAItHSADz37V0tARLqSOA6B8OcN3UCRuoPac+AODYTQMYFYWxUiIkdS/IZAk+djM9KBxm6hsLox3ko6fGC4TYsSETkqxG8INDkaj+ofCAGL0B/UrpZAyOPQKaZN70skInI0i98QaKE88sVisR2468O6g2JalIjIERW/IdDCwTi2geHIj0OvGL54/nusyzrYpuWJiHS2+A2BFtoCkbqDnIOyqlq++uCHPP3Jngjval1oS2BXYXnYzelERI5m8RsCUbYE9hwo55OdB7jtlY2tLbVZSUV1HXkllWFlZVV1UaypiEjnidsQaEmkewfVO6j1vhOgoqbxAP79f67kO39fEXlBXh5c9dDHfJBZGPZSVe3hDYGD5dW8ti6XmjrdwlpEYhO3IdBiSyBCWb1zVHsH1NC3vb5+L29uzGt1mat2N+//r6w5vAfnuxZt4brHV/HhtsJDVxYRaUX8hkCLYwLNyzblFHPFnz8MvM8FvnQm+2BFu5YPh78lkHMw0P1UWll7iJoiIq2L228Wu/rh5cHHd1/Z+DXIkQaGn1+VFfb87sWfsfCDHcHn+0qrGNAjlXe37mvTZ1fVHt6WQEOXVnWdxh5EJDbtbgmY2QgzW2pmn5rZRjP7oVf+CzPLNrM13s9FIe+5xcwyzWyLmX2xIzagJbV19fzHSUNZe+sFXDF1eON6R6gbqUvnYHlN8PG0X73F/rJqyqvbduZ9uLuDkrzLnqsO8+eISPyLpSVQC9zknFtlZj2BlWa22HvtHufcXaGVzWwSMBuYDAwF3jKz8c65w3I6+9L1Z0Qsb2gInD9pEBk9U3l82e42LW9/WTXVIWf4rV1acKjuoI+3F5KeksQJw3u36bObSmwIgcPc4hCR+NfuloBzLtc5t8p7XAJ8Cgxr5S2XAk8656qcczuATGB6ez+/vRq6Unp1S+ayKa2tbrjq2vo2z8YpOURf/ewFH/Mf973f5s9uKiEYAuoOEpHYdMjAsJmNBk4GlnlF15vZOjNbaGZ9vbJhQOiVWFm0EBpmNs/MVpjZioKCgo5YxcZle78TEyLfTK4l2/eVhp15H+oa45W79kcsj/b7BiJ961mit95+6w5yzrG7sDzmb4ITkUYxh4CZ9QCeA25wzhUDDwDHAFOAXOAPDVUjvD3i/2bn3ALn3DTn3LSMjIxYV7Hp+gKBLpVIg8Qtuf7x1bwXMjD8uzc2s3r3gWb1UpMCf9Lsg00vIKvlpTXZYWMNG7KLWv3Me5dsZdKtb5B1oDzi637rDlq0KY+zfr+URz7c2dmrIhI3YgoBM0smEAD/dM49D+Ccy3PO1Tnn6oG/0tjlkwWMCHn7cCAnls+PRYJZVC2Bpp78ZA83PbO2WfmwPt0BqKwO76p5ZsUefvjkGv4WcgD70r3vU1RRQ0vufTuTypr6ZgPXDfcqakt3UHVtPZn5pXHxjWf5JVUAbAv5JjcRiU0ss4MMeBj41Dl3d0j5kJBqlwMbvMcvA7PNLNXMxgDjgOV0ksQEY3DvbhFfS0owTjum/yGXsb2grFlZempgrD30ymOA0qrAOEFeUXgLIb+4EuccL63JDmsZ7NxXFryA7e5FW8Le03B18/KdB8gvrqSiuuUw+P2bmznv7ndYFaHV0tU0BFnXjzORo0csLYHTgauBc5pMB/2dma03s3XAF4AbAZxzG4GngU3AG8B1h2tmUGumjgoMUZRX1zGkd/eIdWrrXcTbS7RFemoi0DwEGsaUy5uU55dUcdsrm/jhk2u45fn1wfK9xY1hUVMXftirrQ8sbO2eg0y/cwlz/9Zylq7LCgTL1rzws+d3PisgM79rnVFX+6z7S+RIaPcUUefc+0Tu53+9lffcAdzR3s/sCOdPGsQra3OCXQvJidbsIAuRryxuavqYfjjn+GRn41l292QvBLyz8w3ZRZRW1VJeE2gJHCyvDlvGw+/vCF5/sD67iKKKGqpq6qj0wmLqyD5s3lsS9p7aJgOjy3eED0KXV9eSfaCCcYN6kuSNIi94dzuzp48EoKiihrkLlzOwZyrLf37eoTf0KBHrGMiOfWW8sCqLeZ8/hh6pR/d1ks65qMasRNorbm8b0ZKTR/RhVP80vjw1MDGp4aA9ol930lMSg/UaWgJ905JbXNb82Sdz+6XHh5UlJiTQLTmBipo67nt7K1+6931mL/iYMq87qLA0PATKqmopqmicUjrl9kVMv3MJO/YFupqG9OlOeXVjKEBjd1Co/JJK3ttagHOO372xhfPveZf/fmZt8OZ2B7zweWtTXvDaiIYgBLh/aSbXP76qTWMHlTV1lFTWcNPTa3ng39sOWb+jNLQEmq7iXW9u4Rcvt3b314C7F3/G/Lcz+egov+fSS2uyGf8//4qLLjw5+vkuBEb0S+Od//4Cl3rXCHzzjDEkJxpPzZvJhtsaL2I+b9IgAO6+ckqLy0pLTSQ5MfxPmGCQkpjAgne3c9eiz4Ll73wWmOq6KbcYgG+fOYbzjhtIQUkVxRU1nDtxINB4gLvtlU0ADOkVGLd4ZW0Ozjl27CuLOCA8/Y4lXP3wcv60ZCvvZwZmMT2zsvF2GMWVtTjn+NZjK/jtG5uD5c45Sqtq+f2bW3h1XS7F3jUOO/eVcf/SzIjjDZfd/wEn/GIRz63KClsWBMY+2jOFs6wN72toCTRcr9Hw3c73Lc3kkQ93hn3XcyQNrbDSqpYH4wH+vSWfh97b3qb1Phz+vaWAmjrHtla66+rqHcu2F4adHIi0x9HdJj4CbjhvPP/vnHHBq3AXXH0K3VMSOXNcBnM+N6JZF8TYjPTggHBaciKj+qcxZ/oIwHhi+W4yeqaSlNg8W/fsD78h3TkTB7Fo017e+jQfCHRTJSZYswPZFVOH89D7O3hjw17uW5rJrsLAdNHhfbuTdaD5Te7++FbzL7S5/gvHct/STApKq5q99pNn1/FcyL2TbnhyNUP7dOeDzH3sLCxnwqCejM1I51bvTPvG88c365762kPLeOyb0zlYUcPUXy7m8pOHcemUoSzalMfKnQf44+wpHDekFxCYWvuvDXt54tszSEiAzPxSJg/pzUm3L+KSk4Yyf87JYcsuqazhzY15zDp+cLAl8OzKLKaP6cfNz63jzstPCNYtLKtiYM9uVNXWkZqUSFMNAXuo73v4+t8+AeDKz42gV7eWW4KHS0MvUGsH+Lc35/Ptx1bwg3OO5UcXTDhCaybxyPchAI23YQC4YPLg4OOkxASSEhN484azSEtJ5KH3tnPF1OHkl1SRX1IZPNj/+ooTKa+uZeLgnlx4/GB6dkvmwXe20T89hVH904JTPKeP6ccJw3qzY18ZEwf3pLSqlr99sBOAvmkp9OqWxIHy8LPUwb270bNbEks254eVBw5OjSHw9dNG87UZo7j20U/ILark6hmjePj9HZw8MtD9BYHWQlOhrQWApVvCL8575MOdwZYFEHatRIP3M/fx4bZCtuYHwuGF1dm8sDo7+PqFf3qPp+bNoHdaMn/2uo/uWrSFZ73Pvv3SyQC8vDYnGAI5Byv46oMfUVBaRXVtPcUVNWE3zPvJs+sAeG19brDspdU5XDB5EJ///b/5wbnj+NH544OvFZRUsXlvoBXW0DUXyaKNe4OPSytrOycEvKG2shZmfZVW1ZLvfZHRzsLI15CItJVCoA0mDO4JwG1N+v9DpaUkMfe00QCcfmx/HnxnGxeeMJhfXRY4Uy0qryE1OYFuyY1nqGeOGxB8/K0zxzCoVyrrsovC7mfULTkh4m0odhU2Tk+9esYofvzFCfRITWLpTWdTU1/PrsJy1mcXcfOFE0lPCd/NCQajB6RHnOIKgdbQB5n7ePSjXWEB0OCbp48Ju8sqwNceXtasXqjbX90UNgbxbEj4bMopDj7+0VNrKCit4piMHmG38y6tqo14hXRxyN/mtfW5DOiZAgRuB57RI4WrZ47m8WW7+dkLjTOv9pdVs7uwnJFeOG7NK2H+25n88NxxzPv7yrDPbIlzjrLqusM6wFweIQTySyrDwryt17o453h6xR5OHtmX8YN6dtQqShywo/0iomnTprkVK1r4dq+jVH2948NthZw0ojc9D3EmOfWXi0kwWPE/54eVj775NQC233kR1yxczvuZ+/j9V06kW3Iitzy/nqtOHUlFTR3Prszi45+de8gz1tyiCmb++m1OHN6bl72b612zcDlZB8opKKli3MAe/PcXJ3LswB5k9EzFOceYWwITvZ7//ml8vL2Qqpp6Ljt5GGMGpPNpbjHrsg7y0+caD6590pIZ1LMbW/JKmDCoJ+ccN5CkBOPetzODddJSEnnputM5/5532/4HBebOHMWLa3JavbgukmF9urf43RC9uyfz0Nxp/O+LG9i8t4RrzxjDw+83htvo/mmcOS6D2dNH8PePdnHDeeO57ZWNpKUk8WluMZtyixnWpzt/ufoUjh8WfjPANXsOsj7rIIs25bEhu4gZY/szbmAP5p42mj5pKSRY4PuoB/fuFjwxcM6xe385v/lXoMvs22eO4ecXTwpb7spd+/nyAx8Fn3/pxCHc919Tg89Lq2q547VNfOWU4Zwyql+wPDO/hPPufpdjB/bgrR99Pqq/YUtq6upJivLKezkyzGylc25am+oqBDrX/rJqDOibnhJWfsvz69i5r5wn5s2gsqaO8uo6+nl1QqcP1tW7sO6s1qzefYBhfboz0Btsbtj35dV1JCcmkJIUPpbxfy9tIMGMX1wyOeLynHM8tyqbH3tXTu/8zcXe8mpJC2l9/P3jXfzy1U1MGd6He2ZPYVif7sGQa6pfegqXThnK3z7YSffkRI4f1itsCm5L7rz8BDbmFPHPNt4VNhppKYkRz8obfP/sYzgmowcpSQnMX7KVr5wynL++t4N9EcZgIjl/0iAmDenFySP7BMcjAC4+YQhr9hykX3oK//jWqfTunsziTXl8+7HG/w9nT8jgt18+kf99cQNfPmU4SQnGtY+uCAv7nIMV/PLVTfxrQ6Cra/MvZ4W1SNtyMN+aV4IZHDuwJ7V19dQ5x6l3LuG0Y/rz56tOadN2tmRbQSm5Bys5I6RlHI26eofReGPFUIs27uWpT/Zwz+wpndK111kUAnLE5BVXcuqdS5gzfSS/vuKEFuvV1NWTaBb8j/rK2hw+zS0OjhF8dMs5vLYul7MnZHCwvIY7X/+UG84bz1njM5j2q7fYV1rFxScM4bdfOZEeqUn830sbKK2q5eunjebE4X2Cn7Mpp5ilW/LJPlhB//QUPssr4f7/mkpNnSMlKYHSyloSEmD17oN8llfCZ3klnDkug/lLtrLVm43z56um8v1/ruqwv9Hfr50e9iVH7WEGl588jBdXZ9PWyVfJiUZ6ahKllbVh15YkJhiXnjSU044dQHVtPbe/upHKmnouPH4wf7jyJDbvLeGYjB7kHKyge3Ii2QcruOqhZSQY/OKSydz+yia+8/mx3L80sO8awh8C3Z5vbtzLsh37ufaMMUwa2iv42uPLdrMxp4gzjh3ArOMHU1Zdx859ZVz3+Cp2FZaz7GfnUu8cA3t2C57YOOfYX1ZN/x6pYdtWUllDUkIC3VMSmfXHd0lNSoh4+/hT73yLvOIqnvj2DGa24S4AELiO5nv/WMkXJgxk+74yvn3mGMZm9Ai+vnLXfmrrHKeObdvyWuKc46an1zJ6QDo/OHdcTMtqSiEgR1RpVS3pKYnt6hb4aFshyYnGtNH9WqyzavcB8ooqufCEIS3WidXeokr2HChnaJ/uDO3djRdWZ/NpbjFnTxjIhME96ZuWwpJP8ziDUXE/AAAJLElEQVR1TH96e9eOvLEhl1fW5bJ4Yx4ZPVMZPSCNDdnFYV1WA3qk8sL3T+PM3y0Nlg3v2507Lz+Be9/eyic7D/DTWRPZVVjGk5803mR3YM9Ufn7xcSQnJvDe1gKeWB56A95AN9BZ4zL4yXProtrOlKSEDr/y+rZLJnPv25mkpyYGZ681+ObpY/iPk4YwflBPJt/6ZrD88+MzgtOmm5o5tj8XTB7Eg+9sI6840Jr6zlljGdEvjZfX5LB8Z+DiyPGDejCkd/fgcnb8+iLm/X0l72wp4Mbzx2MGv/lXYArzPf95EptzSzhn4kA+N7of1XX1dEtObPZvd3dhOf9YtosF7zZOEZ47cxS3XXo8lTV17CwsY9Yf3wPgnIkDmTa6L98/+1gAiitr6NUtmfve3kqftBS+NmNUs217esUeXlydzYJrplFX5zjp9kVAeJB2BIWAyBFUWVNHalICZkZ1bT2f5ZWQc7CC3KJKThnVl4mDe3LlXz7i1LH9+emsicH3lVXVsiWvhJNH9MHM2FtUSVKikZlfyoh+acGbEeYWVXD5/R/y5VOGMXfmaPaVVgfPsH/wxGpeXptD7+7J1NbVB2cUpSQlMHNsf8YMSGfxpjwe/eZ0+qQlM6BHKgUlVSzdkh+cYXXqmH5cPXMUP3p6bZe+NUeP1KRWB/MhEMpTR/Zh8ad5XHj8YF5fv5efzprIvLPG8tyqrODfpKlFN57FlX/5KOwuwA2+8/mxZB2o4LV1uWHlr/3gDLYXlPH6+lwOlFdz7sRB3LVoC1W19Yzsl8bu/Y2BuePXFwWDqKyqlrV7DjJ6QDpD+0S+tc2hKAREfGLL3hIeXxYYtO7VPZlX1gYGz//zcyNISrCI16w0+CyvhCv/8hE/u+g4rpw2ghdXZ/PIhzu5ZuYo9pdVk5hgwYsW584cxVuf5vPTCyfSPz2FgpIqzp6QwZTbA18meNEJg7nkpGF8YWIGyQkJmEFOUSUV1bV87x+rgl1tl5w0lJLKGtZnF3P+pEFcdepIbn5+Hf/3pcl0S04gKSGBtJREcosqeX5VVtgU5sSEwPhUv7QU6pzjx880D630lEQSEyw4a+zG88Zz/9LM4M0YW9LWFtK3zhhDbnFlswN+rPqkJdO7ezJ90lJYuycwpXxAj1RW/E/7buuiEBCRDlFZUxc2iNzU1rwSiitrwmYiNVVTVx+45qJ7cpsnMYR+fkpiAgkJ1ux+Sg3PV+8+wOV//pCLTxzC/d5MqXuXbOXRj3Zx/3+dzNb8Un73xmZuumACe/YHpk7X1TtW7Go+4eDiE4cwID2Fdz4r4PtnH8vnxvTjoj+9FxhHmTKUO7wJCBfPf58fXzA+eFeAn190HL27JzOkTzecC4wrvL05n3c+K6Bfegq7C8s5Z+JAyqprGdEvjQ8y97G3qJJzjxvI+uwikhISGNU/jV2F5ezYV0avbkn88rLjg3c2iJZCQER8payqlrQoxqUCrZEiZo7tT35JFempSby6Noczx2cEu+EaVNUGgih02RXVdXRPSeQfH++ioKSKG0MuTGyqvt5RUVMXvM38oWwrKKV/egp90lIOXbkFCgERER+LJgR8dwM5ERFppBAQEfExhYCIiI8pBEREfEwhICLiYwoBEREfUwiIiPiYQkBExMeO+ovFzKwA2NXOtw8Amn81VnzTNvuDtjn+xbK9o5xzGW2peNSHQCzMbEVbr5qLF9pmf9A2x78jtb3qDhIR8TGFgIiIj8V7CCzo7BXoBNpmf9A2x78jsr1xPSYgIiKti/eWgIiItCIuQ8DMZpnZFjPLNLObO3t9OoqZjTCzpWb2qZltNLMfeuX9zGyxmW31fvf1ys3M5nt/h3VmNrVzt6D9zCzRzFab2ave8zFmtszb5qfMLMUrT/WeZ3qvj+7M9W4vM+tjZs+a2WZvf8+M9/1sZjd6/643mNkTZtYt3vazmS00s3wz2xBSFvV+NbO5Xv2tZjY3lnWKuxAws0TgfuBCYBIwx8wmde5adZha4Cbn3HHADOA6b9tuBpY458YBS7znEPgbjPN+5gEPHPlV7jA/BD4Nef5b4B5vmw8A13rl1wIHnHPHAvd49bqiPwFvOOcmAicR2Pa43c9mNgz4ATDNOXc8kAjMJv728yPArCZlUe1XM+sH3AqcCkwHbm0IjnZxzsXVDzATeDPk+S3ALZ29XodpW18Czge2AEO8siHAFu/xX4A5IfWD9brSDzDc+89xDvAqYAQuoklqus+BN4GZ3uMkr5519jZEub29gB1N1zue9zMwDNgD9PP226vAF+NxPwOjgQ3t3a/AHOAvIeVh9aL9ibuWAI3/mBpkeWVxxWv+ngwsAwY553IBvN8DvWrx8rf4I/AToN573h846Jyr9Z6Hbldwm73Xi7z6XclYoAD4m9cF9pCZpRPH+9k5lw3cBewGcgnst5XE935uEO1+7dD9HY8hEOmbpuNqCpSZ9QCeA25wzhW3VjVCWZf6W5jZl4B859zK0OIIVV0bXusqkoCpwAPOuZOBMhq7CCLp8tvsdWdcCowBhgLpBLpDmoqn/XwoLW1jh257PIZAFjAi5PlwIKeT1qXDmVkygQD4p3Puea84z8yGeK8PAfK98nj4W5wOXGJmO4EnCXQJ/RHoY2ZJXp3Q7Qpus/d6b2D/kVzhDpAFZDnnlnnPnyUQCvG8n88DdjjnCpxzNcDzwGnE935uEO1+7dD9HY8h8AkwzptVkEJgcOnlTl6nDmFmBjwMfOqcuzvkpZeBhhkCcwmMFTSUX+PNMpgBFDU0O7sK59wtzrnhzrnRBPbl2865q4ClwFe8ak23ueFv8RWvfpc6Q3TO7QX2mNkEr+hcYBNxvJ8JdAPNMLM07995wzbH7X4OEe1+fRO4wMz6ei2oC7yy9unsQZLDNPByEfAZsA34eWevTwdu1xkEmn3rgDXez0UE+kKXAFu93/28+kZgptQ2YD2BmRedvh0xbP/ZwKve47HAciATeAZI9cq7ec8zvdfHdvZ6t3NbpwArvH39ItA33vczcBuwGdgA/B1Ijbf9DDxBYMyjhsAZ/bXt2a/AN71tzwS+Ecs66YphEREfi8fuIBERaSOFgIiIjykERER8TCEgIuJjCgERER9TCIiI+JhCQETExxQCIiI+9v8BlgvogAxdTsMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(loss_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks ok! note however that this optimization can potentially get stuck in local minima like any other gradient based optimization so be careful. Stochastic variational inference is a powerful general purpose inference method but it does not do magic.\n",
    "\n",
    "Let's now get some samples from the posterior:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mu</th>\n",
       "      <th>nu</th>\n",
       "      <th>x</th>\n",
       "      <th>mu_scale</th>\n",
       "      <th>mu_loc</th>\n",
       "      <th>nu_loc</th>\n",
       "      <th>nu_scale</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "      <td>1000.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-1.132981</td>\n",
       "      <td>0.972926</td>\n",
       "      <td>-0.853557</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.303519</td>\n",
       "      <td>0.683251</td>\n",
       "      <td>1.207813</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-2.211305</td>\n",
       "      <td>0.083033</td>\n",
       "      <td>-11.666206</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-1.340877</td>\n",
       "      <td>0.498089</td>\n",
       "      <td>-1.427967</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-1.129678</td>\n",
       "      <td>0.810982</td>\n",
       "      <td>-0.861622</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>-0.923341</td>\n",
       "      <td>1.256558</td>\n",
       "      <td>-0.326371</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>-0.308253</td>\n",
       "      <td>5.927497</td>\n",
       "      <td>7.720804</td>\n",
       "      <td>-1.045208</td>\n",
       "      <td>-1.137778</td>\n",
       "      <td>-0.211238</td>\n",
       "      <td>-0.157409</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                mu           nu            x     mu_scale       mu_loc  \\\n",
       "count  1000.000000  1000.000000  1000.000000  1000.000000  1000.000000   \n",
       "mean     -1.132981     0.972926    -0.853557    -1.045208    -1.137778   \n",
       "std       0.303519     0.683251     1.207813     0.000000     0.000000   \n",
       "min      -2.211305     0.083033   -11.666206    -1.045208    -1.137778   \n",
       "25%      -1.340877     0.498089    -1.427967    -1.045208    -1.137778   \n",
       "50%      -1.129678     0.810982    -0.861622    -1.045208    -1.137778   \n",
       "75%      -0.923341     1.256558    -0.326371    -1.045208    -1.137778   \n",
       "max      -0.308253     5.927497     7.720804    -1.045208    -1.137778   \n",
       "\n",
       "            nu_loc     nu_scale  \n",
       "count  1000.000000  1000.000000  \n",
       "mean     -0.211238    -0.157409  \n",
       "std       0.000000     0.000000  \n",
       "min      -0.211238    -0.157409  \n",
       "25%      -0.211238    -0.157409  \n",
       "50%      -0.211238    -0.157409  \n",
       "75%      -0.211238    -0.157409  \n",
       "max      -0.211238    -0.157409  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# print posterior sample\n",
    "post_sample = model.get_posterior_sample(1000)\n",
    "post_sample.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The method describe gets some important descriptive statistics from the samples. It is just a native Pandas method and we can use it because the output of Brancher are Pandas dataframes. It is nice to work on the shoulders of other people isn't it?\n",
    " [Pandas](https://pandas.pydata.org/pandas-docs/stable/) has plenty of methods for working with data and I recommend you to use them in your Brancher pipelines! I suggest you to get started with Pandas with [this tutorial] (https://pandas.pydata.org/pandas-docs/stable/10min.html).\n",
    "\n",
    "Let's now plot the posterior distributions together with the ground truth values:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f9520db3518>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "g = plt.hist(post_sample[\"mu\"], 50)\n",
    "plt.axvline(x=mu_real, color=\"k\", lw=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.lines.Line2D at 0x7f9520d4bb00>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "g = plt.hist(post_sample[\"nu\"], 50)\n",
    "plt.axvline(x=nu_real, color=\"k\", lw=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize the posterior distribution using a Brancher plotting function. This function relies on [Seaborn](https://seaborn.pydata.org/), a very handy visualization library that works very well in combination with Pandas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 620.375x540 with 12 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from brancher.visualizations import plot_posterior\n",
    "\n",
    "plot_posterior(model, variables=[\"mu\", \"nu\", \"x\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks cool doesn't it? "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Pytorch",
   "language": "python",
   "name": "pytorch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
